import { useUserStore } from '@/stores/userStore.js';
import { updateDriverLatLon } from '@/api/user.js';
import { WS_BASE_URL } from '@/config/myConfiguration.js';
import { getOrderById } from '@/api/order.js'
import { getToken } from '@/utils/auth.js'

let ws = null;
let wsUrl = null;

let needReconnect = null;
let maxReconnectTimes = null;

// 重连锁
let locked = false;
// 定时器 
let timer1 = null;
// 定时更新司机当前位置
let timer2 = null;

/**
 * 初始化ws
 */
function initWs ({ la, lo }) {
	return new Promise((resolve, reject) => {
		const id = useUserStore().getCurrentDriver().id
		wsUrl = `${WS_BASE_URL}?token=${getToken()}&la=${la}&lo=${lo}`
		needReconnect = true;
		maxReconnectTimes = 5;
		createWs();
		resolve();
	})
}

/**
 * 创建ws连接
 */
async function createWs () {
	if (!wsUrl) {
		return;
	}
	// 创建ws连接
	ws = await uni.connectSocket({
		url: wsUrl,
		success: (e) => {
			console.log('>>>客户端创建成功');
		},
		fail: (e) => {
			console.log('>>>客户端创建失败');
		}
	});
	// console.log(ws)
	
	// 重连函数
	const reconect = () => {
		// 不需要重连直接return
		if (!needReconnect) {
			console.log('>>>断开连接，无需重连');
			return;
		}
		// 如果ws不为空 断开然后再重连
		if (ws !== null) {
			ws.close();
		}
		// 重连锁上锁了
		if (locked) {
			return;
		}
		// 可以重连 先上锁
		locked = true;
		// 可重连次数大于0
		if (maxReconnectTimes > 0) {
			console.log('>>>客户端重连中，剩余连接次数: ' + maxReconnectTimes);
			maxReconnectTimes -= 1;
			setTimeout(() => {
				// 重新创建ws连接
				createWs();
				// 释放锁
				locked = false;
			}, 3000);
		} else {
			ws = null;
			console.log('>>>连接超时');
		}
	}
	
	// 连接打开
	ws.onOpen(() => {
		console.log('>>>客户端连接成功');
		// 发送心跳
		ws.send({ data: 'heart beat' });
		// 重置可重连次数
		maxReconnectTimes = 5;
		// 更新位置
		updatelatlon()
		// 初始化定时器
		initTimers()
	});
	
	// 收到消息
	ws.onMessage((e) => {
		const message = JSON.parse(e.data);
		console.log('收到消息: ');
		console.log(message);
		onmessage(message);
	});
	
	// 连接关闭
	ws.onClose(() => {
		console.log('>>>客户端断开连接');
		clearInterval(timer1);
		clearInterval(timer2);
		reconect();
	});

	// 连接异常
	ws.onError((err) => {
		console.log('>>>客户端异常: ', err);
		clearInterval(timer1);
		clearInterval(timer2);
		reconect();
	});
}
/**
 * 初始化两个定时器
 */
const initTimers = () => {
	// 1. 心跳
	if (timer1 !== null) {
		clearInterval(timer1);
	}
	timer1 = setInterval(() => {
		// ws连接准备就绪
		if (ws && ws.readyState === 1) {
			ws.send({ data: 'heart beat' });
			console.log('发送了一个心跳💓');
		}
	}, 3000);
	
	// 2. 司机位置
	if (timer2 !== null) {
		clearInterval(timer2);
	}
	timer2 = setInterval(() => {
		updatelatlon()
	}, 1000 * 60 * 5);
}

/** 
 * 更新司机当前位置
 */
const updatelatlon = () => {
	uni.getLocation({
		isHighAccuracy: true, // 高精度
		success: function (res) {
			const { latitude, longitude } = res
			// 更新
			updateDriverLatLon({
				lon: longitude,
				lat: latitude
			}).then(resp => {
				console.log('更新位置')
			})
		},
		fail: function (err) {
			console.log(err)
		}
	})
}

/**
 * 关闭连接
 */
const closeWs = () => {
  needReconnect = false;
  ws.close();
  ws = null;
}

/**
 * 将需要重连改为false
 */
function doNotNeedReconnectAnyMore () {
	needReconnect = false;
}

/**
 * 如果readyState不等于1，说明连接已断开，需要重连
 */
function reconectIfNecessary () {
	if (ws === null) {
		console.error('连接已断开，需要重连');
		initWs();
	}
}

/**
 * 收到消息
 */
function onmessage (message) {
	switch (message.type) {
		// 初始化消息
		case 0:
			console.log('初始化消息')
			break;
		// 订单消息
		case 1:
			// 关闭连接
			closeWs()
			// 更新按钮
			uni.$emit('do-not-connect')
			// 提示
			const orderId = message.data
			uni.showModal({
				title: '提示',
				content: '系统给您派送了一个代驾订单，请查收',
				showCancel: false,
				success: (res) => {
					if (res.confirm) {
						getOrderById(orderId).then(resp => {
							uni.navigateTo({
								url: `/pages/index/info?query=${JSON.stringify(resp.data)}`
							})
						})
					}
				}
			})
			break;
		// 司机有正在进行中的订单
		case 2:
			// 关闭连接
			closeWs()
			// 更新按钮
			uni.$emit('do-not-connect')
			// 提示
			uni.showToast({
				icon: 'none',
				title: '您有一笔正在执行中的订单，完成后方可听单'
			})
			break;
		// 司机余额不足
		case 3:
			closeWs()
			uni.$emit('do-not-connect')
			uni.showToast({
				icon: 'none',
				title: '您的账户余额不足，请充值后再听单'
			})
			break;
		default:
			break;
	}
	
}

export default {
	initWs,
	closeWs,
	doNotNeedReconnectAnyMore,
	reconectIfNecessary
}